/**
 * 实现一个 Promise.all 方法，用于将多个 Promise 实例包装成一个新的 Promise 实例。
 * 当所有内部的 Promise 实例都转为成功状态时，新的 Promise 实例也会转为成功状态，
 * 并将所有 Promise 的结果作为一个数组传递给回调函数。
 * 如果任何一个内部的 Promise 实例转为失败状态，新的 Promise 实例也会转为失败状态，
 * 并将失败的原因传递给回调函数。
 *
 * @param {Array} promiseArr - 一个包含 Promise 实例的数组。
 * @returns {Promise} 返回一个新的 Promise 实例，该实例将在所有内部的 Promise 实例完成后改变状态。
 */
function myPromiseAll(promiseArr) {
  return new Promise((resolve, reject) => {
    let resArr = []; // 用于存储所有 Promise 实例的成功结果
    promiseArr.forEach((promise) => {
      promise.then(
        (res) => {
          resArr.push(res); // 将当前 Promise 的成功结果添加到结果数组中
          if (resArr.length == promiseArr.length) {
            resolve(resArr); // 当所有 Promise 实例都成功完成时，将新的 Promise 实例转为成功状态
          }
        },
        (err) => {
          reject(err); // 当有任何一个 Promise 实例失败时，将新的 Promise 实例转为失败状态
        }
      );
    });
  });
}

let promise1 = () =>
  new Promise((resolve) => {
    setTimeout(() => {
      resolve(1);
    }, 4000);
  });
let promise2 = () =>
  new Promise((resolve) => {
    setTimeout(() => {
      resolve(2);
    }, 5000);
  });
let promise3 = () =>
  new Promise((resolve) => {
    setTimeout(() => {
      resolve(3);
    }, 1000);
  });
let promise4 = () => Promise.resolve(4);
async function test() {
  const now = performance.now();
  const res1 = await promise1();
  console.log(performance.now() - now, res1);
  const res2 = await promise2();
  console.log(performance.now() - now, res2);
  const res3 = await promise3();
  console.log(performance.now() - now, res3);
  const res4 = await promise4();
  console.log(performance.now() - now, res4);
}
test();
const now2 = performance.now();
myPromiseAll([promise2(), promise1(), promise3(), promise4()])
  .then((res) => {
    console.log(res, performance.now() - now2);
  })
  .catch((err) => {
    console.error(err);
  });
